package org.feng.resource;

import java.util.List;

import javax.inject.Inject;
import javax.transaction.Transactional;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.feng.entity.Device;
import org.feng.entity.EntityPool;
import org.feng.entity.ServiceProvider;
import org.feng.entity.User;
import org.jboss.logging.Logger;

import io.quarkus.devconsole.runtime.spi.DevConsolePostHandler;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.security.identity.SecurityIdentity;

@Path("/device")
@Produces(MediaType.APPLICATION_JSON)
//@Consumes(MediaType.APPLICATION_JSON)
public class DeviceRs {

	 private static final Logger LOG = Logger.getLogger(DeviceRs.class);
	 public DeviceRs() {

	}

	/**
	 * 根据服务商类别获取所有服务商
	 */
	//@Path("svr_list")
	@GET
	public RetMsg list(
			@QueryParam("id")String id,
			@QueryParam("type")String type, 
			@QueryParam("status")String status,
			@QueryParam("bleId")String bleId, 
			@QueryParam("position")String position, 
			@QueryParam("page") Integer pageIndex, 
			@QueryParam("limit") Integer pageSize) {
		RetMsg rm = (RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		String sqlWhere = " status<>-2 " ;//把标记为删除的数据滤掉
		User us = (User)si.getAttribute("userInfo");
		if (us.type==1) {//限制只访问自己的数据,只有平台可以访问所有的
			sqlWhere += " and svrId = " + us.svrId + " and ispId="+us.ispId;
		}else if (us.type==2) {
			sqlWhere += " and supplierId = " + us.svrId + " and ispId="+us.ispId;
		}
		//LOG.info("Device:id "+id);
		if (null!=id && (!"".equals(id)))//如果有ID就忽略其他所有的参数
			sqlWhere += " and id = " + id ;
		else{
			if (null!=type && (!"".equals(type)))
				sqlWhere += " and type=" + type;
			if (null!=status && (!"".equals(status)))
				sqlWhere += " and status=" + status;
			if (null!=position && (!"".equals(position)))
				sqlWhere += " and position like '%" + position + "%'";
			if (null!=bleId && (!"".equals(bleId)))
				sqlWhere += " and bleId = '" + bleId + "'";
		}
	
		LOG.info("Device:"+sqlWhere);
		PanacheQuery<Device> pageSp = Device.find(sqlWhere);
		if (pageIndex==null||pageIndex < 1)
			pageIndex = 1;
		if (pageSize==null|| pageSize< 1)
			pageSize = 20;
		pageSp.page(pageIndex-1, pageSize);//pageIndex 在页面从1开始,但后台从0开始
		rm.data = pageSp.list();
		rm.count = pageSp.count();
		return rm;
	}

	// 认证对象,可以获取已经认证通过的用户信息
	@Inject
	SecurityIdentity si;

	/**
	 * 新增设备
	 */
	//@Path("add")
	@PUT
	@Produces(MediaType.APPLICATION_JSON) // 返回类型
	@Consumes(MediaType.APPLICATION_JSON) // 提交类型
	@Transactional
	public RetMsg add(Device dev) {
		Object us = si.getAttribute("userInfo");
		if (us != null){// 如果没有登录就不设置运营商ID
			dev.ispId = ((User) us).ispId;// 设置运营商ID
			dev.supplierId = ((User) us).svrId;// 设置供应商ID
		}
		/*if (dev.type>2||dev.type<0)
			dev.type=0;*/
		//dev.Id=null;
		//LOG.info(sp.toString());
		dev.persist();// 提交到数据库
		//dev.flush();// 更新到数据库
		RetMsg rm=(RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		rm.obj=dev;
		return rm;
	}

	/**
	 * 更新设备
	 */
	//@Path("update")
	@POST
	@Produces(MediaType.APPLICATION_JSON) // 返回类型
	@Consumes(MediaType.APPLICATION_JSON) // 提交类型
	@Transactional
	public RetMsg update(Device dev) {
		Device devPsot=Device.findById(dev.id);
		devPsot.batch=dev.batch;
		devPsot.model=dev.model;
		//LOG.info(sp.toString());
		//dev.getEntityManager().merge(dev);
		//dev.flush();// 更新到数据库
		devPsot.flush();
		RetMsg rm=(RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		rm.obj=devPsot;
		return rm;
	}
	/**
	 *  报废设备
	 */
	@Path("{id}")
	@DELETE
	@Produces(MediaType.APPLICATION_JSON) // 返回类型
	@Transactional
	public RetMsg delete(@PathParam("id")int id) {
		RetMsg rm=(RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		rm.count= Device.update("status=-2 where id = ?1", id);
		if (rm.count<1) {
			rm.code="-2";
			rm.msg="报废失败";
		}else {
			rm.code="0";
			rm.msg="报废成功";		
		}
		return rm;
	}

	/**
	 *  更新设备状态
	 */
	@Path("status/{id}/{status}")
	@GET
	@Produces(MediaType.APPLICATION_JSON) // 返回类型
	@Transactional
	public RetMsg status(@PathParam("id")int id,@PathParam("status")byte status) {
		RetMsg rm=(RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		//LOG.info("status="+status +", id="+id);
		rm.count= Device.update("status=?1 where id = ?2",status, id);
		if (rm.count>0){// 如果没有登录就不设置运营商ID
			rm.msg="设置设备状态成功";
			rm.code="0";
		}else {
			rm.msg="设置设备状态失败";
			rm.code="-1";
		}
		
		return rm;
	}
	
	/**
	 *  更新设备属性值
	 */
	@Path("update/{id}/{field}/{value}")
	@GET
	@Produces(MediaType.APPLICATION_JSON) // 返回类型
	@Transactional
	public RetMsg updateField(@PathParam("id")int id,@PathParam("field")String field,@PathParam("value")String value) {
		RetMsg rm=(RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		Device devPsot=Device.findById(id);
		rm.count=0;
		if (null==devPsot) {
			rm.code="-1";
			rm.msg="编号为["+id+"]的设备不存在";
			return rm;
		}
		switch (field) {
		case "batch":
			devPsot.batch=value;		
			break;
		case "model":
			devPsot.model=value;		
			break;
		case "position":
			devPsot.position=value;		
			break;

		default:
			rm.code="-2";
			rm.msg="不允许更新列"+field;
			return rm;
		}
		devPsot.flush();//Device.update("?1=?2 where id = ?3",field,value, id);
		//LOG.info("status="+status +", id="+id);
		rm.count=1 ;
		rm.code="0";
		rm.msg="更新成功["+id+"]";		
		return rm;
	}

   /**
	 * 判断蓝牙MAC地址是否重复
	 */
	@Path("unique/{bleId}")
	@GET
	// @Produces(MediaType.APPLICATION_JSON)
	public RetMsg isUnique(@PathParam("bleId") String bleId) {//
		RetMsg rm = (RetMsg) (EntityPool.getEntityObject(RetMsg.class));
		Device dev=Device.find("bleId", bleId).firstResult();
		LOG.info("bleId="+bleId+" dev="+dev );
		if (null==dev) {
			rm.code="0";
		}else {
			rm.code="1";
		}
		return rm;
	}
	   /**
		 * 服务商绑定设备
		 */
		@Path("bind/{id}")
		@GET
		@Transactional
		// @Produces(MediaType.APPLICATION_JSON)
		public RetMsg bind(@PathParam("id") int id) {//
			RetMsg rm = (RetMsg) (EntityPool.getEntityObject(RetMsg.class));
			User us = si.getAttribute("userInfo");
			rm.count=1;
			if (us == null){// 如果没有登录就不设置运营商ID
				rm.msg="绑定设备失败,未登录";
				rm.code="3";
				return rm;
			}else if (us.type!=1) {
				rm.msg="绑定设备失败,你不是服务商工作人员,不能绑定设备";
				rm.code="4";
				return rm;
			}
			
			Device dev=Device.findById(id);
			if (null==dev) {
				rm.msg="设备编号不存在,请检查设备编号是否输入正确";
				rm.code="1";
				return rm;
			}else {
				//LOG.info("dev.svrId="+dev.svrId );
				ServiceProvider sp=dev.getServer();
				//LOG.info(sp );
				if (sp!=null) {
					rm.msg="设备已经绑定到了["+sp.name+"]名下,请确认设备编号输入正确无误后联系你的供货商";
					rm.code="2";
					return rm;
				}
			}
			rm.count=1;
			dev.svrId= us.svrId;
			dev.flush();
			//rm.count= Device.update("svrId=?1 where svrId<1 and id = ?2",, id);
			rm.msg="绑定设备成功";
			rm.code="0";
			return rm;
		}
		   /**
			 * 服务商解绑设备
			 */
			@Path("unbind/{id}")
			@GET
			@Transactional
			// @Produces(MediaType.APPLICATION_JSON)
			public RetMsg unbind(@PathParam("id") int id) {//
				RetMsg rm = (RetMsg) (EntityPool.getEntityObject(RetMsg.class));
				User us = si.getAttribute("userInfo");
				rm.count=1;
				if (us == null){// 如果没有登录就不设置运营商ID
					rm.msg="解绑设备失败,未登录";
					rm.code="3";
					return rm;
				}else if (us.type!=1) {
					rm.msg="解绑设备失败,你不是服务商工作人员,不能解绑设备";
					rm.code="4";
					return rm;
				}
				
				Device dev=Device.findById(id);
				if (null==dev) {
					rm.msg="设备编号不存在,请检查设备编号是否输入正确";
					rm.code="1";
					return rm;
				}else if (us.svrId !=dev.svrId) {
					rm.msg="解绑设备失败,设备没有与你的服务商绑定";
					rm.code="4";
					return rm;
				}
				rm.count=1;
				dev.svrId= 0;
				dev.flush();
				//rm.count= Device.update("svrId=?1 where svrId<1 and id = ?2",, id);
				rm.msg="解绑设备成功";
				rm.code="0";
				return rm;
			}

}
